//  博客列表
var express = require("express");
var router = express.Router();
var blogTypes = require("../models/blogType");
var articles = require("../models/article");
var moment = require('moment');

function returnRes(obj) {
  const { res, code, data, message } = obj
  res.json({
    code: code,
    data: data ? data : null,
    message: message ? message : '成功' //失败的情况下，需要传入失败信息 否则默认成功
  });
  return false
}

// 1. 新增/修改/删除【博客分类】（都是将最新的集合发送过来）---【后台】
router.post("/addType", function (req, res, next) {
  let data = req.body;
  blogTypes.findOne(function (err1, doc1) {
    //【逻辑1】
    // 集合不存在，新建集合
    if (err1) {
      returnRes({ res, code: -1, message: err1 })
      return false
    }
    // 根据是是否有集合来判断接下来的操作是创建还是保存
    if (doc1 == "" || doc1 == null) {
      blogTypes.create(data[0], function (err2, doc2) {
        if (err2) {
          returnRes({ res, code: -1, message: err2 })
        } else {
          returnRes({ res, code: 0, message: '创建成功' })
        }
      })
      return false
    }
    doc1.children = data[0].children
    doc1.save(function (err3, doc3) {
      if (err3) {
        returnRes({ res, code: -1, message: err3 })
      } else {
        returnRes({ res, code: 0, message: '修改成功' })
      }
    })
  });
});

// 2. 查询【博客分类】
router.post("/typeList", function (req, res, next) {
  let data = req.body;
  blogTypes.findOne(function (err, doc) {
    doc = doc.toObject()
    // 让value变更id的值，这样多联级下拉就会绑定id的值，也就是和类别绑定。
    function changeVal(arr) {
      arr.forEach(item => {
        if (item.children && item.children.length > 0) {
          item.value = item._id
          changeVal(item.children)
        } else {
          item.value = item._id
        }
      })
    }
    changeVal(doc.children)
    if (err) {
      returnRes({ res, code: -1, message: err })
      return false
    }
    returnRes({ res, code: 0, data: !doc ? null : doc.children, message: '查询成功' })
  });
});

// 3. 新建/修改【博客】--【后台】
router.post('/editAricle', function (req, res, next) {
  let { title, tag, types, content, id } = articleObj = req.body
  //  有id为修改，没有id为新增
  //  注意 =====【find查询来的数组是没有save方法的，但是数组项是有save方法的】
  articles.find(function (err0, doc0) {
    if (doc0 == '' || doc0 == null) {
      /*逻辑【1】 新建集合
       **  整理数据
       **  第一篇文章设置id为1
       */
      articleObj.id = 1
      articleObj.times = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
      articleObj.autor = '子树'
      articleObj.Pageview = 0
      articleObj.coverImage = 'https://img1.baidu.com/it/u=3788606852,2363382091&fm=253&app=53&size=w500&n=0&g=0n&f=jpeg?sec=1645867645&t=ab9b3f5093eabb41b8cf458e659c1b62'
      // 插入数据
      articles.create([articleObj], function (err1, doc1) {
        err1 ? returnRes({ res, code: -1, message: err1 }) : returnRes({ res, code: 0, data: null, message: '成功' })
      })
      return false
    }
    /*逻辑【2】 修改数据
     **  如果传了id，那么就修改集合中的原文章
     */
    if (id) {
      for (let i = 0; i < doc0.length; i++) {
        if (doc0[i].id == id) {
          //  注意 =====【find查询来的数组是没有save方法的，但是数组项是有save方法的】
          doc0[i] = Object.assign(doc0[i], articleObj)
          doc0[i].save(function (err2, doc2) {
            if (err2) {
              returnRes({ res, code: -1, message: err2 })
            } else {
              returnRes({ res, code: 0, data: null, message: '修改成功' })
            }
          })
          return false
        }
      }
      return false
    }

    /*逻辑【3】 新增数据
     **  如果没有传id,那么就添加文章
     */
    // 新文章加id
    articleObj.id = doc0[doc0.length - 1].id + 1
    articleObj.times = moment(new Date()).format(
      'YYYY-MM-DD HH:mm:ss'
    )
    articleObj.autor = '子树'
    articleObj.Pageview = 0
    articleObj.coverImage = 'https://img1.baidu.com/it/u=3788606852,2363382091&fm=253&app=53&size=w500&n=0&g=0n&f=jpeg?sec=1645867645&t=ab9b3f5093eabb41b8cf458e659c1b62'

    //  注意 =====【find查询来的数组是没有save方法的，但是数组项是有save方法的，另外也可以直接new 一个modal出来使用它的save】
    let data = new articles(articleObj)
    data.save(function (err3, doc3) {
      if (err3) {
        returnRes({ res, code: -1, message: err3 })
      } else {
        returnRes({ res, code: 0, data: articleObj.id, message: '新增成功' })
      }
    })
  })
})

// 4.读取【博客列表】--【后台】
router.post('/articleList', function (req, res, next) {
  let { id, title, startTime, endTime, types, pageSize, tag, pageNumber, needContent } = req.body
  const reg = new RegExp(title, 'i') //不区分大小写
  const where = {
    $or: [{ title: reg }], //标题模糊匹配
    id: id, //精准查询id
    types: types, //精准查询类型
    times: startTime ? { //查询时间范围内，注意的是需要转换时间格式
      "$gte": new Date(startTime),
      "$lt": new Date(endTime)
    } : '',
    //前面的判断是当传递的是空数组，要查结果是否在条件数组中，使用$in，
    //例如查询的数组为A,数组库中存的数组为B，只要B数组中有一项在A中，就返回B数组所在项
    tag: ((tag && tag.length === 0) || !tag) ? '' : { $in: tag },
  }
  // 处理传空的项目，传空或者空数组，就不要输入该项的查询条件，直接删除此项,保证传空也可以查询全部
  for (let item in where) {
    if (!where[item] || (where[item] && where[item].length === 0)) {
      delete where[item]
    }
  }

  // 先获取总条数
  articles.countDocuments(where, function (err0, count) {
    if (err0) {
      returnRes({ res, code: -1, message: err0 })
      return false
    }
    // 查单个数据
    if (id) {
      articles
        .findOne(where).exec(function (err1, doc1) {
          // 更新阅读数量，当是查询单个数据的时候，默认是用户在阅读该博客，博客的阅读数量累加一
          doc1.Pageview++
          doc1.save(function (err_Pageview, doc_Pageview) {
          })
          if (err1) {
            returnRes({ res, code: -1, message: err1 })
            return false
          }
          // 格式化时间,注意要先深克隆一份doc，否则下面的格式化会失效
          let result = JSON.parse(JSON.stringify(doc1))
          result.times = moment(result.times + '').format("YYYY-MM-DD HH:SS:MM")
          returnRes({
            res, code: 0, data: result, message: '查询成功'
          })
        })
      return false

    }
    // 查列表多个数据，需要分页查询,时间倒叙
    articles
      .find(where)
      .skip((pageNumber - 1) * parseInt(pageSize))
      .limit(parseInt(pageSize)).sort([['times', -1]])
      .exec(function (err2, doc2) {

        if (err2) {
          returnRes({ res, code: -1, message: err2 })
          return false
        }

        // 格式化时间
        let result2 = JSON.parse(JSON.stringify(doc2))
        result2.forEach((element, index) => {
          element.times = moment(element.times).format("YYYY-MM-DD HH:SS:MM")
          element.describe = element.content.slice(0, 50)
          if (!needContent) {
            delete element.content
          }
        });
        returnRes({
          res, code: 0, data: { list: result2 || [], total: count, }, message: '查询成功'
        })
      })
  })
})

// 5.删除博客
router.post('/delete', function (req, res, next) {
  let id = req.body.id
  console.log('删除id', id)
  articles.remove({ id: id }, function (err, doc) {
    if (err) {
      returnRes({ res, code: -1, message: err })
    } else {
      returnRes({ res, code: 0, data: null, message: '删除成功' })
    }
  })
})


module.exports = router;
